# character.gd
extends CharacterBody3D

const JUMP_VELOCITY = 4.5
@export var _walking_speed: float = 1 # 速度
@export var _running_speed: float = 2 # 速度
@export var _acceleration: float = 2 # 加速度
@export var _deceleration: float = 4 # 减速度
@export var _rotation_speed: float = PI * 2 # 旋转速度

var _movement_speed: float = _walking_speed # 移动速度
var _angle_difference: float
var _xz_velocity: Vector3

# $ -> 从当前附加该脚本的节点开始查找元素; ${子节点名称}
# 如果子节点名称有空格, 可以用引号: $"Animation Tree"
# 如果不确定路径是否正确, 可以右键子节点 -> 复制节点路径
@onready var _animation: AnimationTree = $AnimationTree
# 获取characterBody下的Rig(导入的模型)
@onready var _rig: Node3D = $Rig

var _direction: Vector3


#func _ready() -> void:
# # 将角度值转换为弧度值
#_rotation_speed = deg_to_rad(_rotation_speed)

# 改变前进方向
func move(direction: Vector3):
    _direction = direction


# 行走
func walk():
    _movement_speed = _walking_speed


# 跑
func run():
    _movement_speed = _running_speed


func _physics_process(delta: float) -> void:
    # 改变物体朝向
    if _direction:
        # 计算y轴旋转的角度
        #var _target_angle:float = atan2(_direction.x, _direction.z)
        # wrapf包装, 将值限定在-PI和PI之间, 让旋转以最小的角度进行
        #var _angle_difference:float = wrapf(_target_angle - _rig.rotation.y, -PI, PI)
        _angle_difference = wrapf(atan2(_direction.x, _direction.z) - _rig.rotation.y, -PI, PI)
        # clamp限制值的范围
        _rig.rotation.y += clamp(_rotation_speed * delta, 0, abs(_angle_difference)) \
        *sign(_angle_difference)

    # 复制角色的x和z, 隔离y
    _xz_velocity = Vector3(velocity.x, 0, velocity.z)
    # Add the gravity.
    if not is_on_floor():
        velocity += get_gravity() * delta

    # Handle jump.
    if Input.is_action_just_pressed("ui_accept") and is_on_floor():
        velocity.y = JUMP_VELOCITY

    #
    if _direction:
        # 点积, 向量相乘, 方向相同结果为1, 相反为-1, 垂直为0
        if _direction.dot(velocity) >= 0: # 同方向加速
            # 改变rig(人物模型)的朝向 (因为godot反转了z轴, 所以为了和输入的朝向一致, 使用减号
            #_rig.look_at(position - _direction)
            # 向xz方向移动, 并且提供加速度
            _xz_velocity = _xz_velocity.move_toward(_direction * _movement_speed, _acceleration*delta)
        else:
            # 此时向相反方向移动, 减速
            _xz_velocity = _xz_velocity.move_toward(_direction * _movement_speed, _deceleration*delta)

    else:
        # 没有提供方向的时候, 减速
        _xz_velocity = _xz_velocity.move_toward(Vector3.ZERO, _deceleration * delta)

    # 可以点击animation-tree, 在属性栏中找到然后右键复制属性路径
    # 该值blend_position代表speed的百分比(0-1)
    # 移动距离 / 奔跑时速度(速度上限)
    _animation.set("parameters/Locomotion/blend_position", _xz_velocity.length() / _running_speed)

    # 调整角色的xz
    velocity.x=_xz_velocity.x
    velocity.z=_xz_velocity.z

    move_and_slide()
